dump-core: store .xen_p2m or .xen_pfn section in pfn ascending order.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Fri, 9 Mar 2007 18:33:36 +0000 (18:33 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Fri, 9 Mar 2007 18:33:36 +0000 (18:33 +0000)
So far the order isn't specified and may be random in theory.
But sorted array is requested by crash utility for efficient search.

Fortunately it is the case except ia64 full virtualized domain.
Update document such that those array must be sorted and fix the ia64
full virtualized domain case.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
docs/misc/dump-core-format.txt
tools/libxc/xc_core_ia64.c
tools/libxc/xc_ptrace_core.c

index 99384ca94a0ddc4557c8669a6d281f5807c19050..545740b6bd9cec71d740299b915836c9b1678804 100644 (file)
@@ -80,8 +80,7 @@ Currently the following sections are defined. Some sections are optional.
                         gmfn:   machine physical frame number
                 The size of arrays is stored in xch_nr_pages member of header
                 note descriptor in .note.Xen note section.
-                There is no rule about the order. Analysis tools must no rely
-                on its order.
+                The entryies are stored in pfn-ascending order.
                 This section must exist when the domain is non auto
                 translated physmap mode. Currently x86 paravirtualized domain.
 
@@ -94,8 +93,7 @@ Currently the following sections are defined. Some sections are optional.
                 in .xen_pages section.
                 The size of arrays is stored in xch_nr_pages member of header
                 note descriptor in .note.Xen note section.
-                There is no rule about the order. Analysis tools must no rely
-                on its order.
+                The entries are stored in ascending order.
                 This section must exist when the domain is auto translated
                 physmap mode. Currently x86 full virtualized domain and
                 ia64 domain.
@@ -226,6 +224,8 @@ Currently only (major, minor) = (0, 1) is used.
 [When the format is changed, it would be described here.]
 
 (0, 1) update
+- .xen_p2m, .xen_pfn section
+  Arrays must be in pfn ascending order for efficient looking up.
 - EI_CLASS member of elf header was changed to ELFCLASS64 independent of
   architecture. This is mainly for x86_32pae.
   The format version isn't bumped because analysis tools can distinguish it.
index 455d532ee2c8105c4e92258353e0c124eff14e8c..dff561b3d469a4c3b2b2c0bab60b7f4c23e7ac2b 100644 (file)
 #include "xc_core.h"
 #include "xc_efi.h"
 #include "xc_dom.h"
+#include <inttypes.h>
+
+static int
+xc_memory_map_cmp(const void *lhs__, const void *rhs__)
+{
+    const struct xc_core_memory_map *lhs =
+        (const struct xc_core_memory_map *)lhs__;
+    const struct xc_core_memory_map *rhs =
+        (const struct xc_core_memory_map *)rhs__;
+
+    if (lhs->addr < rhs->addr)
+        return -1;
+    if (lhs->addr > rhs->addr)
+        return 1;
+
+    /* memory map overlap isn't allowed. complain */
+    DPRINTF("duplicated addresses are detected "
+            "(0x%" PRIx64 ", 0x%" PRIx64 "), "
+            "(0x%" PRIx64 ", 0x%" PRIx64 ")\n",
+            lhs->addr, lhs->size, rhs->addr, rhs->size);
+    return 0;
+}
 
 int
 xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info)
@@ -111,6 +133,7 @@ memory_map_get_old_hvm(int xc_handle, xc_dominfo_t *info,
     }
     *mapp = map;
     *nr_entries = i;
+    qsort(map, *nr_entries, sizeof(map[0]), &xc_memory_map_cmp);
     return 0;
 
 out:
@@ -196,6 +219,7 @@ xc_core_arch_memory_map_get(int xc_handle, xc_dominfo_t *info,
     ret = 0;
 out:
     munmap(memmap_info, PAGE_SIZE);
+    qsort(map, *nr_entries, sizeof(map[0]), &xc_memory_map_cmp);
     return ret;
     
 old:
index 82d06bb2d8c901c04b327e58c5f50f99a8e19630..42d49cfcb787eacafdf35693785130670181a031 100644 (file)
@@ -390,7 +390,6 @@ map_gmfn_to_offset_elf(unsigned long gmfn)
 {
     /* 
      * linear search
-     * There is no gurantee that those tables are sorted.
      */
     unsigned long i;
     if (current_is_auto_translated_physmap) {